package bdsimple.impl.mysql;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import bdsimple.abstractfactory.AbstractFactoryDAO;
import bdsimple.dao.base.CiudadDAO;
import bdsimple.dao.base.ItemVentaDAO;
import bdsimple.dao.base.PropiedadDAO;
import bdsimple.dao.base.PropiedadVampiroDAO;
import bdsimple.dao.base.VampiroDAO;
import bdsimple.dto.base.CiudadDTO;
import bdsimple.dto.base.ItemVentaDTO;
import bdsimple.dto.base.PropiedadDTO;
import bdsimple.dto.base.PropiedadVampiroDTO;
import bdsimple.dto.base.VampiroDTO;
import dao.base.impl.BaseDTO;
import dao.base.impl.Reference;

public class PropiedadVampiroDTOImpl extends BaseDTO implements
		PropiedadVampiroDTO {

	public PropiedadVampiroDTOImpl() {
		super(PropiedadVampiroDAO.class);
	}

	// ---------------------------------------------------------------------------

	private int numeroSirvientes;

	private int numeroSeguridad;

	private boolean habilitada;

	private final Reference<PropiedadDTO> propiedadDTORef = //
	new Reference<PropiedadDTO>();

	private final Reference<VampiroDTO> vampiroDTORef = //
	new Reference<VampiroDTO>();

	private final Reference<CiudadDTO> ciudadDTORef = //
	new Reference<CiudadDTO>();

	private List<ItemVentaDTO> itemVentaDTOList;

	// ---------------------------------------------------------------------------

	public int getNumeroSirvientes() {
		return numeroSirvientes;
	}

	public void setNumeroSirvientes(int numeroSirvientes) {
		this.numeroSirvientes = numeroSirvientes;
	}

	// ---------------------------------------------------------------------------

	public int getNumeroSeguridad() {
		return numeroSeguridad;
	}

	public void setNumeroSeguridad(int numeroSeguridad) {
		this.numeroSeguridad = numeroSeguridad;
	}

	// ---------------------------------------------------------------------------

	public boolean getHabilitada() {
		return habilitada;
	}

	public void setHabilitada(boolean habilitada) {
		this.habilitada = habilitada;
	}

	// ---------------------------------------------------------------------------

	public Reference<PropiedadDTO> getPropiedadDTORef() {
		return propiedadDTORef;
	}

	public PropiedadDTO getPropiedadDTO() {
		if (propiedadDTORef.getRefValue() == null) {
			if (propiedadDTORef.getRefIdent() != 0) {
				try {

					// Lazy load the departmentDTORef
					PropiedadDAO propiedadDAO = (PropiedadDAO) AbstractFactoryDAO
							.getFactoryDAO(). //
							getDAO(PropiedadDAO.class, connectionBean);

					propiedadDTORef.setRefValue( //
							(PropiedadDTO) propiedadDAO
									.loadById(propiedadDTORef.getRefIdent()));

				} catch (Exception e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			}
		}

		return propiedadDTORef.getRefValue();
	}

	public void setPropiedadDTORef(PropiedadDTO propiedadDTORef) {
		this.propiedadDTORef.setRefValue(propiedadDTORef);
	}

	// ---------------------------------------------------------------------------

	public Reference<VampiroDTO> getVampiroDTORef() {
		return vampiroDTORef;
	}

	public VampiroDTO getVampiroDTO() {
		if (vampiroDTORef.getRefValue() == null) {
			if (vampiroDTORef.getRefIdent() != 0) {
				try {

					// Lazy load the departmentDTORef
					VampiroDAO vampiroDAO = (VampiroDAO) AbstractFactoryDAO
							.getFactoryDAO(). //
							getDAO(VampiroDAO.class, connectionBean);

					vampiroDTORef.setRefValue( //
							(VampiroDTO) vampiroDAO.loadById(vampiroDTORef
									.getRefIdent()));

				} catch (Exception e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			}
		}

		return vampiroDTORef.getRefValue();
	}

	public void setVampiroDTORef(VampiroDTO vampiroDTORef) {
		this.vampiroDTORef.setRefValue(vampiroDTORef);
	}

	// ---------------------------------------------------------------------------

	public Reference<CiudadDTO> getCiudadDTORef() {
		return ciudadDTORef;
	}

	public CiudadDTO getCiudadDTO() {
		if (ciudadDTORef.getRefValue() == null) {
			if (ciudadDTORef.getRefIdent() != 0) {
				try {

					// Lazy load the departmentDTORef
					CiudadDAO ciudadDAO = (CiudadDAO) AbstractFactoryDAO
							.getFactoryDAO(). //
							getDAO(CiudadDAO.class, connectionBean);

					ciudadDTORef.setRefValue( //
							(CiudadDTO) ciudadDAO.loadById(ciudadDTORef
									.getRefIdent()));

				} catch (Exception e) {
					e.printStackTrace();
					throw new RuntimeException(e);
				}
			}
		}

		return ciudadDTORef.getRefValue();
	}

	public void setCiudadDTORef(CiudadDTO ciudadDTORef) {
		this.ciudadDTORef.setRefValue(ciudadDTORef);
	}

	// ---------------------------------------------------------------------------

	@SuppressWarnings("unchecked")
	public List<ItemVentaDTO> getItemVentaDTOList() {
		if (itemVentaDTOList == null) {
			try {

				// Lazy load the list
				ItemVentaDAO itemVentaDAO = (ItemVentaDAO) AbstractFactoryDAO
						.getFactoryDAO(). //
						getDAO(ItemVentaDAO.class, connectionBean);

				itemVentaDTOList = new ArrayList<ItemVentaDTO>();
				itemVentaDTOList.addAll((Collection<? extends ItemVentaDTO>) // 
						itemVentaDAO.listBy(ItemVentaDTOImpl.ID, id));

			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		}

		return itemVentaDTOList;
	}

	public void setItemVentaDTOList(List<ItemVentaDTO> itemVentaDTOList) {
		throw new UnsupportedOperationException();
	}

	// ---------------------------------------------------------------------------

}
